<?php
/**
 * @APP@
 *
 * PHP versions 5
 *
 * @category   BEAR
 * @package    App
 * @subpackage App_Form
 * @author     $Author: anonymous $ <anonymous@example.com>
 * @version    SVN: Release: $Id:$
 */
/**
 * ユーザーフォーム
 *
 * <pre>
 * ユーザー、ユーザープロフィールに関するフォームです
 * </pre>
 *
 * @package    App
 * @subpackage App_Form
 * @author     $useror: anonymous $
 * @version    SVN: Release: $Id:$
 */
class App_Form_User extends BEAR_Base
{
    /**
     * エレメントテンプレート
     *
     * @var string
     */
    static $_elementTemplate = "\n\t\t<li><label class=\"element\"><!-- BEGIN required --><span class=\"required\">*</span><!-- END required -->{label}</label><div class=\"element<!-- BEGIN error -->_error<!-- END error -->\">{element}<!-- BEGIN error --><span class=\"error\">!</span><!-- END error --><!-- BEGIN label_3 -->{label_3}<!-- END label_3 --><!-- BEGIN label_2 --><!-- END label_2 --></div></li>";

    /**
     * テンプレート (Freese)
     *
     * @var string
     */
    private static $_elementTemplateFreeze = "\n\t\t<li><label class=\"element\"><!-- BEGIN required --><span class=\"required\">*</span><!-- END required -->{label}</label><div class=\"element<!-- BEGIN error -->_error<!-- END error -->\">{element}<!-- BEGIN error --><span class=\"form-element-error\" alt=\"!\"><img src=\"/image/warning.gif\"><!-- END error --></div></li>";

    /**
     * フォーム
     *
     * @var array
     */
    private $_form = array('formName' => 'form');

    /**
     * アトリビュート
     *
     * @var array
     */
    private $_attr = array('name' => 'size="30" maxlength="30"',  'email' => 'size="30" maxlength="30"', 'body'=>'rows="8" cols="40"');

    /**
     * セレクトボックスセパレータ （フリーズしたときに変更
     *
     * @var mixed
     */
    private $_separator = array('&nbsp;', '<br />');

    /*
     * デフォルト
     *
     * @var mixed
     */
    private $_defaults = null;

    /**
     * セッションオブジェクト
     *
     * @var mixed
     */
    private $_session = array();

    private $_header = 'サインアップ';

    /**
     * インジェクト（最初の表示）
     *
     */
    public function onInject()
    {
    }

    /**
     * モバイルインジェクト
     *
     */
    public function onInjectMobile()
    {
        $this->_form = array('formName' => 'form', 'callback'=>array(__CLASS__, 'onRenderFreeze'));
        $this->_attr =  array('name' => 'size="12" maxlength="30"',  'email' => 'size="12" maxlength="30"', 'body'=>'rows="8" cols="20"');
        $this->onInject();
    }

    /**
     * インジェクト　- フリーズ
     *
     */
    public function _injectPreview()
    {
        $this->_form = array('formName' => 'form', 'callback'=>array(__CLASS__, 'onRenderFreeze'));
        $this->_separator = '&nbsp;';
        $this->_header = '確認してください';
    }


    /**
     * インジェクト - 修正
     *
     */
    public function _injectModify()
    {
        $this->_defaults = $_POST;
    }

    /**
     * フォームの状態をセット
     *
     * フォームの状態を通常、確認（フリーズ）、修正にセットします
     *
     * @param string $mode モード
     */
    private function _injectFormMode($formMode)
    {
        switch ($formMode) {
            case 'default':
                break;
            case 'preview':
                $this->_separator = '&nbsp;';
                $this->_injectPreview();
                break;
            case 'modify':
                $this->_defaults = $_POST;
                $this->_injectModify();
                break;
            default:
                ;
                break;
        }
    }

    /**
     * ユーザー作成フォーム
     *
     * @return void
     */
    public function build($formMode)
    {
        $this->_injectFormMode($formMode);
        $this->_form = BEAR::factory('BEAR_Form', $this->_form);
        $this->_form->setDefaults($this->_defaults);
        $this->_form->addElement('header', '', $this->_header);
        $this->_form->addElement('text', 'user_name', array(
            'ID<span class="small">(ニックネーム)</span>',
            '<!--<a href=/user/create.php rel="ajax" class="ajax">使用できるか確認</a>-->',
            '<span id="idcheck">&nbsp;</span>'), 'size=32');
        $this->_form->addElement('password', 'password', array('パスワード', '6文字から12文字'), 'size=12 maxsize=12');
        $this->_form->addElement('password', '_repeatPass', array('パスワードを再入力', 'もう一度入力してください'), 'size=12 maxsize=12');
        $this->_form->addElement('text', 'email', array('Email',
            '<i>メールアドレスを他の目的で使用することはありません</i>'));
        $this->_form->addElement('hidden', 'act_key', md5(uniqid(rand(), true)));
        $this->_form->addRule('user_name', 'IDの入力が必要です', 'required', 'client');
        $this->_form->addRule('email', 'Eメールの入力が必要です', 'required');
        $this->_form->addRule('email', 'メールアドレス形式ではありません', 'email');
        // passwordをhiddenに入れる場合
        $this->_form->getElement('password')->setPersistantFreeze(true);
        $this->_form->getElement('_repeatPass')->setPersistantFreeze(true);
        // ボタン
        $this->_form->addRule('password', 'パスワードの入力が必要です', 'required');
        $this->_form->addRule('_repeatPass', 'パスワード確認の入力が必要です', 'required');
        $this->_form->addRule('password', 'パスワードは4文字以上12文字以下です。', 'rangelength', array(4, 12));
        $this->_form->addRule(array('password', '_repeatPass'), 'パスワード確認とマッチしません', 'compare', null);
    }


    public function freeze()
    {
        $password = $this->_form->getElementValue('password');
        $session = BEAR::dependency('BEAR_Session', $this->_session);
        $session->set('user_create_password', $password);
        $buttons[] =& $this->_form->createElement('submit', '_action', '送信', '');
        $buttons[] =& $this->_form->createElement('submit', '_modify', '修正', '');
        $this->_form->addGroup($buttons);
        $this->_form->freeze();
    }

    /**
     * 最初の画面のボタン
     *
     * @return void
     */
    public function buildConfirmButton()
    {
        $this->_form->addElement('submit', '_freeze', '確認...', '');
    }

    /**
     * 確認画面のボタン
     *
     * @return void
     */
    public function buildSendButton()
    {
        $buttons = array();
        $buttons[] =& $this->_form->createElement('submit', '_action', '送信', '');
        $buttons[] =& $this->_form->createElement('submit', '_modify', '修正', '');
        $this->_form->addGroup($buttons);
        $this->_form->freeze();
    }

    /**
     * カスタムテンプレート
     *
     * @param object $render
     *
     * @return void
     */
    public static function onRender($render)
    {
        $render->setElementTemplate(self::$_elementTemplate);
    }

    /**
     * カスタムテンプレート(Freeze)
     *
     * @param object $render
     *
     * @return void
     */
    public static function onRenderFreeze($render)
    {
        $render->setElementTemplate(self::$_elementTemplateFreeze);
    }
}